#pragma once
#ifndef SCNET_CLIENT_HPP
#define SCNET_CLIENT_HPP

#include "Core.hpp"
#include "SocketWrapper.hpp"

#include <atomic>
#include <functional>

namespace scNet {
	class Client : public ClientCore {
	private:
		std::unique_ptr<SocketWrapper> socket_;		// 用于与服务器通信的套接字
		std::atomic<bool> connected_{false};     	// 用于指示客户端是否已连接到服务器
		std::function<void(const std::string&)> error_handler_;  // 错误处理函数

		int timeout_ms_ = 3000;  // 默认超时为 3秒
	public:
		Client();
		~Client() override; 

		// 继承ClientCore 的接口实现
		void connect(const std::string& ip, uint16_t port) override;  // 连接到指定服务器
    	void send(const std::string& data) override;  // 发送数据
    	std::string receive() override;  // 接收数据
    	void start(uint16_t port = 0) override { (void)port; }  // 客户端不需要监听端口，空实现
    	void stop() override;  // 停止客户端，断开连接

		// 错误处理函数
		void setErrorHandler(std::function<void(const std::string&)> handler);
		// 设置超时
		void setTimeout(int timeout_ms);
		// 检查是否连接
		bool isConnected() const;
	};
}


#endif